//package com.lzq.framework.util.validate;
//
//import com.tritonsfs.cac.depository.base.core.dto.BaseConstantCode;
//import com.tritonsfs.cac.depository.base.core.dto.Prompt;
//import com.tritonsfs.cac.depository.core.dto.ResultBean;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.springframework.stereotype.Component;
//import org.springframework.ui.ModelMap;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.servlet.ModelAndView;
//
//import java.lang.annotation.Annotation;
//import java.lang.reflect.InvocationTargetException;
//import java.lang.reflect.Method;
//import java.util.Map;
//
///**
// *
// * @ClassName: ValidateAspectHandel
// * @Description: 验证注解处理类 TODO 前期缓存controller 校验信息
// * @author yanggq
// * @date 2016年4月19日 下午2:06:19
// *
// */
//@Component
//@Aspect
//public class ValidateAspectHandel {
//
//    /**
//     *
//     * @Title: validateAround
//     * @Description: 使用AOP对使用了ValidateGroup的方法进行代理校验
//     * @param @param joinPoint
//     * @param @return
//     * @param @throws Throwable 方法参数
//     * @return Object 返回类型
//     * @throws 异常信息
//     */
//    @SuppressWarnings({ "finally", "rawtypes" })
//    @Around("@annotation(com.tritonsfs.cac.depository.core.validate.ValidateGroup)")
//    public Object validateAround(ProceedingJoinPoint joinPoint) throws Throwable {
//        ResultBean<?> rb = null;
//        ValidateGroup vg = null;
//        Object[] args = null;
//        Method method = null;
//        Object target = null;
//        String methodName = null;
//        try {
//            methodName = joinPoint.getSignature().getName();
//            target = joinPoint.getTarget();
//            method = getMethodByClassAndName(target.getClass(), methodName); // 得到拦截的方法
//            args = joinPoint.getArgs(); // 方法的参数
//            vg = (ValidateGroup) getAnnotationByMethod(method, ValidateGroup.class);
//            rb = validateFiled(vg.fileds(), args);
//        } catch (Exception e) {
////            logger.debug((e.getStackTrace()!=null)?e.getStackTrace().toString():null);
//            rb = new ResultBean(BaseConstantCode.VALIDATE_FILED_EXCEPTION);
//        } finally {
//            if (rb.getReturnCode().equals("0000")) {
//                return joinPoint.proceed();
//            } else { // 这里使用了Spring MVC ，所有返回值应该为Strng或ModelAndView
////                logger.debug("方法 "+method.getName()+" "+rb.getReturnMessage());
//                String[] classRequestMappingValue={};
//                String[] methodRequestMappingValue={};
//                for(Annotation classAnnotation:target.getClass().getAnnotations()){
//                    if(classAnnotation instanceof RequestMapping){
//                        classRequestMappingValue= ((RequestMapping) classAnnotation).value();
//                    }
//                }
//                //获取方法RequestMapping 值
//                for(Annotation methodAnnotation:method.getDeclaredAnnotations()){
//                    if(methodAnnotation instanceof RequestMapping){
//                        methodRequestMappingValue= ((RequestMapping) methodAnnotation).value();
//                    }
//                }
//                Class returnType = method.getReturnType(); // 得到方法返回值类型
//                if (returnType == String.class) { // 如果返回值为Stirng
//                    return rb.toString(); // 返回错误页面
//                } else if (returnType == ModelAndView.class) {
//                    ModelAndView modelAndView=new ModelAndView();
//                    String url="";
//                    System.out.println(classRequestMappingValue);
//                    if(!classRequestMappingValue.equals("[]")&&classRequestMappingValue.length!=0&&classRequestMappingValue[0]!=null){
//                        url=classRequestMappingValue[0]+"/"+methodRequestMappingValue[0];
//                    }else{
//                        url=methodRequestMappingValue[0];
//                    }
//
//                    modelAndView.setViewName(url);
//                    Map<String,Object> map=new ModelMap();
//                    map.put(rb.getReturnMessage().substring(0, rb.getReturnMessage().indexOf(" ")), rb.getReturnMessage().substring(rb.getReturnMessage().indexOf(" ")+1, rb.getReturnMessage().length()));
//                    modelAndView.addAllObjects(map);
//                    return modelAndView;// 返回错误页面
//                } else { // 当使用Ajax的时候 可能会出现这种情况
//                    return null;
//                }
//            }
//        }
//    }
//
//    /**
//     *
//     * @param <T>
//     * @Title: validateFiled
//     * @Description: 验证参数是否合法
//     * @param @param valiedatefiles
//     * @param @param args
//     * @param @return
//     * @param @throws SecurityException
//     * @param @throws IllegalArgumentException
//     * @param @throws NoSuchMethodException
//     * @param @throws IllegalAccessException
//     * @param @throws InvocationTargetException 方法参数
//     * @return boolean 返回类型
//     * @throws 异常信息
//     */
//    @SuppressWarnings("rawtypes")
//    public  ResultBean<?> validateFiled(ValidateFiled[] valiedatefiles, Object[] args) throws SecurityException,
//            IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
//        ResultBean resultBean=new ResultBean(new Prompt("0000","参数校验通过！"));
//        for (ValidateFiled validateFiled : valiedatefiles) {
//            Object arg = null;
//            boolean b=true;
//            if ("".equals(validateFiled.filedName())) {
//                arg = args[validateFiled.index()];
//                b=false;
//            } else {
//                arg = getFieldByObjectAndFileName(args[validateFiled.index()], validateFiled.filedName());
//            }
//
//            if (validateFiled.notNull()) { // 判断参数是否为空
//                if (arg == null){
//                    Prompt prompt=new Prompt("1000",(validateFiled.filedName())+" 参数不能为 null");
//                    resultBean=new ResultBean(prompt);
//                    return resultBean;
//                }
//            } else { // 如果该参数能够为空，并且当参数为空时，就不用判断后面的了 ，直接返回true
//                if (arg == null){
//                    Prompt prompt=new Prompt("0000","参数校验通过！");
//                    resultBean=new ResultBean(prompt);
//                    return resultBean;
//                }
//            }
//            String message=(b?((!validateFiled.tip().equals(""))?(b?(validateFiled.filedName()+" "+validateFiled.tip()):(validateFiled.filedName()+" "+validateFiled.tip())):validateFiled.filedName()):((!validateFiled.tip().equals(""))?validateFiled.tip():validateFiled.name()));
////            String message="";
////            if(!validateFiled.tip().equals("")){
////                message=validateFiled.tip();
////            }else{
////                message=b?validateFiled.filedName():validateFiled.name();
////            }
//            if (validateFiled.maxLen() > 0) { // 判断字符串最大长度
//                if (((String) arg).length() > validateFiled.maxLen()){
//                    Prompt prompt=new Prompt("1000",(!validateFiled.tip().equals(""))?(b?(validateFiled.filedName()+" "+validateFiled.tip()):(validateFiled.filedName()+" "+validateFiled.tip())):((message)+" 参数最大长度不能超过 "+ validateFiled.maxLen()));
//                    resultBean=new ResultBean(prompt);
//                    return resultBean;
//                }
//            }
//
//            if (validateFiled.minLen() > 0) { // 判断字符串最小长度
//                if (((String) arg).length() < validateFiled.minLen()){
//                    Prompt prompt=new Prompt("1000",(!validateFiled.tip().equals(""))?(b?(validateFiled.filedName()+" "+validateFiled.tip()):(validateFiled.filedName()+" "+validateFiled.tip())):((message)+" 参数最小长度不能小于 "+ validateFiled.minLen()));
//                    resultBean=new ResultBean(prompt);
//                    return resultBean;
//                }
//            }
//
//            if (validateFiled.maxVal() != -1) { // 判断数值最大值
//                if ((Integer) arg > validateFiled.maxVal()){
//                    Prompt prompt=new Prompt("1000",(!validateFiled.tip().equals(""))?(b?(validateFiled.filedName()+" "+validateFiled.tip()):(validateFiled.filedName()+" "+validateFiled.tip())):((message)+" 参数最大值不能超过 "+ validateFiled.maxVal()));
//                    resultBean=new ResultBean(prompt);
//                    return resultBean;
//                }
//            }
//
//            if (validateFiled.minVal() != -1) { // 判断数值最小值
//                if ((Integer) arg < validateFiled.minVal()){
//                    Prompt prompt=new Prompt("1000",(!validateFiled.tip().equals(""))?(b?(validateFiled.filedName()+" "+validateFiled.tip()):(validateFiled.filedName()+" "+validateFiled.tip())):((message)+" 参数最小值不能小于 "+ validateFiled.minVal()));
//                    resultBean=new ResultBean(prompt);
//                    return resultBean;
//                }
//            }
//
//            if (!"".equals(validateFiled.regStr())) { // 判断正则
//                if (arg instanceof String) {
//                    if (!((String) arg).matches(validateFiled.regStr())){
//                        Prompt prompt=new Prompt("1000",(!validateFiled.tip().equals(""))?(b?(validateFiled.filedName()+" "+validateFiled.tip()):(validateFiled.filedName()+" "+validateFiled.tip())):((message)+" 参数正则表达式不能通过验证  "+ validateFiled.regStr()));
//                        resultBean=new ResultBean(prompt);
//                        return resultBean;
//                    }
//                } else {
//                    Prompt prompt=new Prompt("1000",(!validateFiled.tip().equals(""))?(b?(validateFiled.filedName()+" "+validateFiled.tip()):(validateFiled.filedName()+" "+validateFiled.tip())):((message)+" 参数正则表达式不正确  "+ validateFiled.regStr()));
//                    resultBean=new ResultBean(prompt);
//                    return resultBean;
//                }
//            }
//        }
//        return resultBean;
//    }
//
//    /**
//     *
//     * @Title: getFieldByObjectAndFileName
//     * @Description: 根据对象和属性名得到 属性
//     * @param @param targetObj
//     * @param @param fileName
//     * @param @return
//     * @param @throws SecurityException
//     * @param @throws NoSuchMethodException
//     * @param @throws IllegalArgumentException
//     * @param @throws IllegalAccessException
//     * @param @throws InvocationTargetException 方法参数
//     * @return Object 返回类型
//     * @throws 异常信息
//     */
//    public Object getFieldByObjectAndFileName(Object targetObj, String fileName) throws SecurityException,
//            NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
//        String tmp[] = fileName.split("\\.");
//        Object arg = targetObj;
//        for (int i = 0; i < tmp.length; i++) {
//            Method methdo = arg.getClass().getMethod(getGetterNameByFiledName(tmp[i]));
//            arg = methdo.invoke(arg);
//        }
//        return arg;
//    }
//
//    /**
//     *
//     * @Title: getGetterNameByFiledName
//     * @Description: 根据属性名 得到该属性的getter方法名
//     * @param @param fieldName
//     * @param @return 方法参数
//     * @return String 返回类型
//     * @throws 异常信息
//     */
//    public String getGetterNameByFiledName(String fieldName) {
//        return "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
//    }
//
//    /**
//     *
//     * @Title: getAnnotationByMethod
//     * @Description: 根据目标方法和注解类型 得到该目标方法的指定注解
//     * @param @param method
//     * @param @param annoClass
//     * @param @return 方法参数
//     * @return Annotation 返回类型
//     * @throws 异常信息
//     */
//    public Annotation getAnnotationByMethod(Method method, Class<?> annoClass) {
//        Annotation all[] = method.getAnnotations();
//        for (Annotation annotation : all) {
//            if (annotation.annotationType() == annoClass) {
//                return annotation;
//            }
//        }
//        return null;
//    }
//
//    /**
//     *
//     * @Title: getMethodByClassAndName
//     * @Description: 根据类和方法名得到方法
//     * @param @param c
//     * @param @param methodName
//     * @param @return 方法参数
//     * @return Method 返回类型
//     * @throws 异常信息
//     */
//    public Method getMethodByClassAndName(Class<?> c, String methodName) {
//        Method[] methods = c.getDeclaredMethods();
//        for (Method method : methods) {
//            if (method.getName().equals(methodName)) {
//                return method;
//            }
//        }
//        return null;
//    }
//
//}
